
#ifndef __HTTP_HXX__
#define __HTTP_HXX__

////////////////////////////////////////////////////////////////////////////////

#include "sock-inet-tcp.hxx"

#include <map>
#include <stdexcept>
#include <string>

namespace http {

////////////////////////////////////////////////////////////////////////////////

    class error : public std::exception {
    };

////////////////////////////////////////////////////////////////////////////////

    class bad_request_error : public error {
        virtual const char* what() const noexcept {
            return "400 Bad Request";
        }
    };

////////////////////////////////////////////////////////////////////////////////

    class not_found_error : public error {
        virtual const char* what() const noexcept {
            return "404 Not Found";
        }
    };

////////////////////////////////////////////////////////////////////////////////

    class length_required_error : public error {
        virtual const char* what() const noexcept {
            return "411 Length Required";
        }
    };

////////////////////////////////////////////////////////////////////////////////

    class bad_response_error : public error {
    };

////////////////////////////////////////////////////////////////////////////////

    std::string
    read_request(sock_inet_tcp&);

    std::string
    read_response(sock_inet_tcp&);

    std::map<std::string,std::string>
    read_headers(sock_inet_tcp&);

    std::vector<char>
    read_body(sock_inet_tcp&, const std::map<std::string,std::string>&);

    void
    skip_body(sock_inet_tcp&, const std::map<std::string,std::string>&);

////////////////////////////////////////////////////////////////////////////////

}

#endif
